//
// Created by kunnkali on 2023/5/23.
//

#ifndef TNET_INTERPRETER_H
#define TNET_INTERPRETER_H

#include "Option.h"
#include "Result.h"
#include "Tensor.h"
#include <memory>
#include <unordered_map>

namespace TNet {
    class InterpreterImpl;

    class TNET_API Interpreter {
    public:
        Interpreter();
        ~Interpreter();

        // 快速判断当前Interpreter是否初始化
        bool operator()() {
            return _impl ? true : false;
        };

        // 基于同一的option初始化
        Base::Result init(const Option &options);
        void uninit();
        // 执行推理
        Base::Result forward();
        // 获取输入Tensor数量
        size_t inputs() const;
        // 获取输入Tensor数量
        size_t outputs() const;
        // 获取模型输入的第一个TMETensor的引用
        Tensor inputTensor();
        // 获取模型输出的第一个TMETensor的引用
        Tensor outputTensor();
        // 提供更加灵活的获取TMETensor的能力，针对多输出多输入的模型
        Tensor tensor(TensorType tensorType, size_t index);
        // 提供更加灵活的获取TMETensor的能力，针对多输出多输入的模型
        Tensor tensor(TensorType tensorType, const std::string& name);
        // 用于存储模型的元数据，具体下一步在细化
        std::unordered_map<std::string, std::string> metaInfos();
        // 获取模型选定的推理框架
        FrameworkTypeTag getFrameworkTypeTag();

    private:
        std::unique_ptr<InterpreterImpl> _impl;
        FrameworkTypeTag frameworkTypeTag = kTflite;// 选定的推理框架类型

        TNET_DECLARE_NON_COPYABLE(Interpreter);
    };

}// namespace TNet

#endif// TNET_INTERPRETER_H
